package com.zxg.androidbuslearn

import android.os.Bundle
import android.support.v4.app.FragmentManager
import android.view.View
import android.widget.Button

/**
 * 作者: 赵小刚
 * 生成时间: 2018/10/30.
 * 版本: 1.0
 * 简介:
 * 修改记录:
 */
class FragmentMainActivity : BaseActivity(), View.OnClickListener, SecondFragment.CallBack {
    // Fragment 系统有写好的一些子类，
    // DialogFragment——显示弹出框，和Activity分隔开，
    // ListFragment——列表控件，替换ListActivity类
    // PreferenceFragment——
    // WebViewFragment——

    private var mAddBtn: Button? = null
    private var mRemoveBtn: Button? = null
    private var mReplaceBtn: Button? = null
    private var mHideBtn: Button? = null
    private var mShowBtn: Button? = null
    private var mDetachBtn: Button? = null
    private var mAttachBtn: Button? = null

    private var mSecondFragment: SecondFragment? = null
    private var mThirdFragment: ThirdFragment? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.fragemnt_main)
        mAddBtn = findViewById(R.id.add_btn)
        mRemoveBtn = findViewById(R.id.remove_btn)
        mReplaceBtn = findViewById(R.id.replace_btn)
        mHideBtn = findViewById(R.id.hide_btn)
        mShowBtn = findViewById(R.id.show_btn)
        mDetachBtn = findViewById(R.id.detach_btn)
        mAttachBtn = findViewById(R.id.attach_btn)

        // 创建 Fragment 实例
        mSecondFragment = SecondFragment()
        // 传参(1.1) -- 使用静态方法（不推荐）
        // 传参(1.2) - 使用Bundle进行值的传递
        var bundle = Bundle()
        bundle.putString("Key", "Activity初始化Fragment")
        mSecondFragment!!.arguments = bundle
        mThirdFragment = ThirdFragment()

        // 设置监听事件
        mAddBtn!!.setOnClickListener(this)
        mRemoveBtn!!.setOnClickListener(this)
        mReplaceBtn!!.setOnClickListener(this)
        mHideBtn!!.setOnClickListener(this)
        mShowBtn!!.setOnClickListener(this)
        mDetachBtn!!.setOnClickListener(this)
        mAttachBtn!!.setOnClickListener(this)

//        // 1. 获取到 FragmentManager 对象
//        val fragmentManager = supportFragmentManager // v4 包使用
//        // getFragmentManager() // 原生系统提供 -- 不建议使用
////        fragmentManager.findFragmentById(R.id.idName) // 根据Id 获取Fragment
////        fragmentManager.findFragmentByTag("TagName") // 根据TAG 获取Fragment
////        fragmentManager.fragments // 获取添加的全部Fragment
////        fragmentManager.popBackStack() // 弹出最上层
//        // 2. 开启一个事务
//        var fragmentTransaction = fragmentManager.beginTransaction()
//        // 3. 向容器中放入一个 Fragment
//        var fragment = FirstFragment()
//        fragmentTransaction.add(R.id.frameLayout, fragment, "TAGName")
////        fragmentTransaction.remove(fragment) // 删除Fragment实例
////        fragmentTransaction.replace(R.id.frameLayout, fragment) // 替换当前的Fragment实例。实际是删除全部添加的Fragment实例，再添加当前的Fragment实例
////        fragmentTransaction.hide(fragment) // 隐藏fragment, 没有销毁
////        fragmentTransaction.show(fragment) // 显示fragment
////        fragmentTransaction.detach(fragment) // 移除fragment的UI view视图
////        fragmentTransaction.attach(fragment) // 重构fragment的UI view视图
////        fragmentTransaction.addToBackStack("TAGName") // 根据 Tag 名称 将 Fragment添加到回退栈中
//        // 4. 提交事务
//        fragmentTransaction.commit()
    }

    override fun onClick(v: View?) {// 1. 获取到 FragmentManager 对象
        val fragmentManager = supportFragmentManager // v4 包使用
        // 2. 开启一个事务
        var fragmentTransaction = fragmentManager.beginTransaction()
        // 3. Fragment操作
        when(v!!.id) {
            R.id.add_btn -> {
                // 向容器中添加Fragment
                if (!mSecondFragment!!.isAdded && null == fragmentManager.findFragmentById(R.id.frameLayout)) {
                    fragmentTransaction.add(R.id.frameLayout, mSecondFragment!!)
                }
                if (!mThirdFragment!!.isAdded && null == fragmentManager.findFragmentById(R.id.frameLayout2)) {
                    fragmentTransaction.add(R.id.frameLayout2, mThirdFragment!!)
                }
            }
            R.id.remove_btn -> {
                // 从容器中移除Fragment
                fragmentTransaction.remove(mSecondFragment!!)
            }
            R.id.replace_btn -> {
                if (!mSecondFragment!!.isAdded) {
                    fragmentTransaction.replace(R.id.frameLayout, mSecondFragment!!)
                }
            }
            R.id.hide_btn -> {
                if (!mSecondFragment!!.isHidden) {
                    fragmentTransaction.hide(mSecondFragment!!)
                }
            }
            R.id.show_btn -> {
                if (mSecondFragment!!.isHidden) {
                    fragmentTransaction.show(mSecondFragment!!)
                }
            }
            R.id.detach_btn -> {
                if (!mSecondFragment!!.isDetached) {
                    fragmentTransaction.detach(mSecondFragment!!)
                }
            }
            R.id.attach_btn -> {
                if (mSecondFragment!!.isDetached) {
                    fragmentTransaction.attach(mSecondFragment!!)
                }
            }
            else -> {
                LogUtil.logE(TAG, "id == " + v.id)
            }
        }
        // 将事务添加到回退栈
        fragmentTransaction.addToBackStack(null)
        // 4. 提交事务
        val id = fragmentTransaction.commit()
//        fragmentManager.popBackStack(id, FragmentManager.POP_BACK_STACK_INCLUSIVE)
//        popBackStack(int id, int flags)：其中id表示提交变更时commit()的返回值。
//        popBackStack(String name, int flags)：其中name是addToBackStack(String tag)中的tag值。
//        调用该方法后会将事物操作插入到FragmentManager的操作队列，只有当轮询到该事物时才能执行。
//        如果想立即执行事物的话，可以使用下面这几个方法：
//        popBackStackImmediate()：
//        popBackStackImmediate(String tag)：
//        popBackStackImmediate(String tag, int flag)：
//        popBackStackImmediate(int id, int flag)：

        // 传参(2.1) -- 使用公开方法- Activity To Fragment
        val fragment = fragmentManager.findFragmentById(R.id.frameLayout)
        if (null != fragment && fragment is SecondFragment) {
            fragment.setData("Activity发送消息到Fragment")
        }
    }

    // 传参(2.2) -- 使用公开方法 - Fragment To Activity
    fun setDataFromSecondFragment(value: String) {
        LogUtil.logE(TAG, value)
    }

    // 传参(3.1) -- 使用接口回调
    override fun onContentChange(result: String) {
        LogUtil.logE(TAG, result)
    }

    companion object {
        private val TAG = "FragmentMainActivity"
    }
}